package org.jpropelleralt.set;

import java.util.Collection;
import java.util.Set;

import org.jpropelleralt.box.Box;
import org.jpropelleralt.change.Change;
import org.jpropelleralt.collection.CollectionBox;

/**
 * A {@link SetBox} is a {@link CollectionBox} where the type
 * of {@link Collection} implemented is {@link Set}.
 * <p/>
 * {@link SetBox} always produces {@link Change}s of the
 * type {@link SetChange}, giving details of the changes that 
 * have occurred. 
 * <p/>
 * A {@link SetChange} is also propagated when a 
 * {@link Box} contained in the {@link SetBox} has a {@link Change}.
 * This will always be either an ALTERATION change covering the keys 
 * of the set elements that have changed in a deep way,
 * or a COMPLETE change if a more specific range cannot be identified.
 * 
 * @param <E>		The type of element in the set
 */
public interface SetBox<E> extends Box, Set<E>, CollectionBox<E> {
}